/*
 * @Description: TS基础
 * @notes: 
 * @Author: 台火山
 * @Date: 2024-03-08 19:23:17
 * @LastEditors: 台火山
 * @LastEditTime: 2024-03-10 22:24:23
 */
export { }
// object 表示一个js对象
let a: object;
a = {};
a = function () { }

// {} 用来指定对象可以包含哪些属性
/**
 * 语法:
 * {
 *      属性名:属性值,
 *      ...
 * }
 * 在属性名后面添加一个 ? 表示属性是可选的
 */
let b: {
    name: string,
    age?: number,// 不确定是否存在该属性用 ?
};
// ---报错
// b = {};
// ---正确
b = {
    name: '孙悟空'
}

// 只对其中一个属性，其他有没有都可以
// [propName:string]:any
let c: {
    name: string,
    [propName: string]: any
}
c = {
    name: '猪七戒',
    age: 10,
}

// 函数
/**
 * 设置函数结构的类型声明
 * 语法：
 * (形参:类型,形参:类型,...) => 返回值
 */
let d: (a: number, b: number) => number;
d = function (n1, n2): number {
    return n1 + n2
}


// 数组
/**
 * 数组的类型声明：
 *  类型[]
 * Array<类型>
 */
// string[] 表示字符串数组
let e: string[];
e = ['a', 'b', 'c'];

// number[] 表示数字数组
let f: number[];
let g: Array<number>;
g = [1, 2, 3, 4, 5];


/**
 * 元组：固定长度的数组
 * 语法:[类型,类型]
*/
let h: [string, string];
h = ['hello', 'abc'];

/**
 * enum 枚举
 */
enum Gender {
    Male = 0,
    Female = 1,
}
let i: { name: string, gender: Gender };
i = {
    name: "孙悟空",
    gender: Gender.Male,
}
console.log(i.gender === Gender.Male);

// & 表示同时
// let j: string & number;// 错误的
let j: { name: string } & { age: number };
j = { name: '孙悟空', age: 18 };


// 类型的别名
type myType = 1 | 2 | 3 | 4 | 5;
let k: myType;
let l: myType;
let m: myType;